<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Template</title>
<link type="text/css" rel="stylesheet" href="/doc/style.css">
<script type="text/javascript" src="/doc/godocs.js"></script>
<script type="text/javascript">
</script>
<style>
body {
	margin: 0;
	font-family: Helvetica, Arial, sans-serif;
	font-size: 16px;
}
pre,
code {
	font-family: Consolas, Menlo, monospace;
	font-size: 14px;
}
pre {
	line-height: 18px;
}
pre .comment {
	color: #375EAB;
}
pre .highlight,
pre .highlight-comment,
pre .selection-highlight,
pre .selection-highlight-comment {
	background: #FFFF00;
}
pre .selection,
pre .selection-comment {
	background: #FF9632;
}
pre .ln {
	color: #999;
}
body {
	color: #222;
}
a,
.exampleHeading .text {
	color: #375EAB;
	text-decoration: none;
}
a:hover,
.exampleHeading .text:hover {
	text-decoration: underline;
}
p,
pre,
ul,
ol {
	margin: 20px;
}
pre {
	background: #e9e9e9;
	padding: 10px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
h1,
h2,
h3,
h4,
.rootHeading {
	margin: 20px 0;
	padding: 0;
	color: #375EAB;
	font-weight: bold;
}
h1 {
	font-size: 24px;
}
h2 {
	font-size: 20px;
	background: #E0EBF5;
	padding: 2px 5px;
}
h3 {
	font-size: 20px;
}
h3,
h4 {
	margin: 20px 5px;
}
h4 {
	font-size: 16px;
}
.rootHeading {
	font-size: 20px;
	margin: 0;
}
dl {
	margin: 20px;
}
dd {
	margin: 2px 20px;
}
dl,
dd {
	font-size: 14px;
}
div#nav table td {
	vertical-align: top;
}
table.dir th {
	text-align: left;
}
table.dir td {
	word-wrap: break-word;
	vertical-align: top;
}
.alert {
	color: #AA0000;
}
div#heading {
	float: left;
	margin: 0 0 10px 0;
	padding: 21px 0;
	font-size: 20px;
	font-weight: normal;
}
div#heading a {
	color: #222;
	text-decoration: none;
}
div#topbar {
	background: #E0EBF5;
	height: 64px;
}
body {
	text-align: center;
}
div#page,
div#topbar > .container {
	clear: both;
	text-align: left;
	margin-left: auto;
	margin-right: auto;
	padding: 0 20px;
	width: 900px;
}
div#page.wide,
div#topbar > .wide {
	width: auto;
}
div#plusone {
	float: right;
}
div#footer {
	color: #666;
	font-size: 14px;
	margin: 40px 0;
}
div#menu > a,
div#menu > input,
div#learn .buttons a,
div#blog .read a {
	padding: 10px;
	text-decoration: none;
	font-size: 16px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
div#menu > a,
div#menu > input {
	border: 1px solid #375EAB;
}
div#menu > a {
	color: white;
	background: #375EAB;
}
a#start,
div#learn .buttons a,
div#blog .read a {
	color: #222;
	border: 1px solid #375EAB;
	background: #E0EBF5;
}
div#menu {
	float: right;
	min-width: 590px;
	padding: 10px 0;
	text-align: right;
}
div#menu > a {
	margin-right: 5px;
	margin-bottom: 10px;
	padding: 10px;
}
div#menu > input {
	position: relative;
	top: 1px;
	width: 60px;
	background: white;
	color: #222;
}
div#menu > input.inactive {
	color: #999;
}
div.left {
	float: left;
}
div.right {
	float: right;
}
div.left,
div.right {
	width: 415px;
}
div#learn,
div#about {
	padding-top: 20px;
}
div#learn h2,
div#about {
	margin: 0;
}
div#about {
	font-size: 20px;
}
div#about {
	height: 96px;
}
div#gopher {
	background: url(/doc/gopher/frontpage.png) no-repeat;
	background-position: center top;
	height: 155px;
}
a#start {
	display: block;
	padding: 10px;
	text-align: center;
	text-decoration: none;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
a#start .big {
	font-weight: bold;
	font-size: 20px;
}
a#start .desc {
	font-size: 14px;
	font-weight: normal;
	margin-top: 5px;
}
div#learn .icon {
	float: right;
	cursor: pointer;
}
div#learn pre,
div#learn textarea {
	padding: 0;
	margin: 0;
	font-family: Menlo, monospace;
	font-size: 14px;
}
div#learn .input {
	padding: 10px;
	margin-top: 10px;
	height: 150px;
	-webkit-border-top-left-radius: 5px;
	-webkit-border-top-right-radius: 5px;
	-moz-border-radius-topleft: 5px;
	-moz-border-radius-topright: 5px;
	border-top-left-radius: 5px;
	border-top-right-radius: 5px;
}
div#learn .input textarea {
	width: 100%;
	height: 100%;
	border: none;
	outline: none;
	resize: none;
}
div#learn .output {
	border-top: none !important;
	padding: 10px;
	height: 59px;
	overflow: auto;
	-webkit-border-bottom-right-radius: 5px;
	-webkit-border-bottom-left-radius: 5px;
	-moz-border-radius-bottomright: 5px;
	-moz-border-radius-bottomleft: 5px;
	border-bottom-right-radius: 5px;
	border-bottom-left-radius: 5px;
}
div#learn .output pre {
	padding: 0;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
div#learn .input,
div#learn .input textarea,
div#learn .output,
div#learn .output pre {
	background: #FFFFD8;
}
div#learn .input,
div#learn .output {
	border: 1px solid #375EAB;
}
div#learn .buttons {
	float: right;
	padding: 20px 0 10px 0;
	text-align: right;
}
div#learn .buttons a {
	height: 16px;
	margin-left: 5px;
	padding: 10px;
}
div#learn .toys {
	margin-top: 8px;
}
div#learn .toys select {
	border: 1px solid #375EAB;
	margin: 0;
}
div#blog,
div#video {
	margin-top: 40px;
}
div#blog > a,
div#blog > div,
div#blog > h2,
div#video > a,
div#video > div,
div#video > h2 {
	margin-bottom: 10px;
}
div#blog .title,
div#video .title {
	display: block;
	font-size: 20px;
}
div#blog .when {
	color: #666;
	font-size: 14px;
}
div#blog .read {
	text-align: right;
}
.toggleButton { cursor: pointer; }
.toggle .collapsed { display: block; }
.toggle .expanded { display: none; }
.toggleVisible .collapsed { display: none; }
.toggleVisible .expanded { display: block; }
table.codetable { margin-left: auto; margin-right: auto; border-style: none; }
hr { border-style: none; border-top: 1px solid black; }
img.gopher {
	float: right;
	margin-left: 10px;
	margin-bottom: 10px;
}
.pkgGopher {
	text-align: right;
}
.pkgGopher .gopher {
	float: none;
	position: relative;
	top: -40px;
	margin-bottom: -120px;
}
h2 { clear: right; }
/* ----------------------------------------- */
div#title h1{text-align:center;}
div#title p{margin:0;padding:0;font-size:10px;text-align:center}
#keywords h1, #keywords p{display:inline;}
/* ----------------------------------------- */
div#head-part {border-bottom: 3px solid black;padding-bottom:16px;border-top: 3px solid black;margin:20px;}
div#head-part h1{font-size:18px;color:black;}
div#summary h1{}
div#summary p{}
div#references{}
/* ----------------------------------------- */
/*body   h1:before{ content:counter(section) ". "; counter-increment:section+1;}*/
/*body   h2:before{ content:counter(subsection) "." counter(subsection) ". "; counter-increment:subsection;};*/
/* ----------------------------------------- */

/* ----------------------------------------- */
</style>
</head>
<body>
<div id="page" class="wide">
  
<!-- ------------------------------------- -->
<div id="title">
	<h1>在Unbutu下建立svn服务器</h1>
	<p>最后更新者：AnKiang@163.com</p>
	<p>最后更新日期: 2012.04.04</p>
</div><!-- title -->
<!-- ------------------------------------- -->
<div id="head-part">
<!-- ------------------------------------- -->
<div id="summary">
	<h1>概要</h1>
	<p>本文描述了在Ubuntu下建立svn服务器的详细过程。包括svn的安装，svn仓库的建立，svn的配置和管理，svn的启动，svn在windows下的访问方法。</p>
</div><!-- summary -->
<!-- ------------------------------------- -->
<div id="keywords">
	<h1>关键词</h1>
	<p>svn服务器，Ubuntu，安装，仓库，配置，管理，访问，Tortoise，Sliksvn</p>
</div><!-- keywords -->
</div><!-- head-part -->
<!-- ------------------------------------- -->
<h1>安装svn</h1>
<p>可以通过下面的命令安装svn服务器：</p>
<pre class="code">apt-get install subversion</pre>
  
<!-- ------------------------------------- -->
<h1>建立svn仓库</h1>
<h2>新建文件夹</h2>
<p>新建一个文件夹用于保存数据</p>
<pre class="code" class="bash">mkdir /home/.svn
cd /home/.svn
mkdir AnKiang</pre>
<h2>创建仓库AnKiang</h2>
<pre class="code">svnadmin create /home/.svn/AnKiang</pre>
<p>执行完毕后AnKiang目录有svnadmin创建的目录和文件</p>
 
<h1>配置和管理svn</h1>
<h2>3.1	打开配置文件</h2>
<p>在创建的仓库目录下，有个conf目录，配置文件就是conf目录下的svnserve.conf：</p>
 
<h2>3.2	配置</h2>
<h3>配置svnserve.conf</h3>
<p>打开svnserve.conf文件后，可以看到一些注释了的配置项：</p>
 
<p>anon-access：匿名用户的权限，可以为read，write和none，默认值read。不允许匿名用户访问：anon-access = none。</p>
<p>auth-access：认证用户的权限，可以为read，write和none，默认值write。</p>
<p>password-db：密码数据库的路径。</p>
<p>authz-db：认证规则库的路径。</p>
<p>配置后的结果：</p>
 
<p>注意：这些配置项的行都要顶格，否则会报错。修改配置后需要重启svn才能生效。</p>
<h3>配置passwd文件</h3>
<p>这是每个用户的密码文件，比较简单，就是“用户名=密码”，采用的是明码。如ankiang=123456</p>
 
<h3>配置authz文件</h3>
<p>[groups] section：为了便于管理，可以将一些用户放到一个组里边，比如：owner=allen,ellen<p>
<p>groups下边的sections表示对一个目录的认证规则，比如对根目录的认证规则的section为[/]。设置单用户的认证规则时一个用户一行，如：</p>
<pre class="text" class="config">[/]
allen=rw  #allen对根目录的权限为rw
ellen=r    #ellen对根目录的权限为r
#如果使用group，需要在group名字前加@,如
@owner=rw  #group owner中的用户均为rw，等价于上边的两句话</pre>
<p>启动时如果从/home/.svn/AnKiang启动，/就是AnKiang目录，用如上方式以AnKiang目录为根设置权限。</p>
<p>如果从/home/.svn/启动，每个仓库根还是自己的起始目录。可以采用如上方式设置AnKiang的权限，也可以采用如下方式：</p>
<pre class="text" class="config">[AnKiang:/]
@owner=rw</pre>
设置test的权限如下：</p>
<p>简言之，每个仓库的根目录(/)就是自己的起始目录；[repos:/]这种方式适用于多仓库的情况；[/]适合于单仓库和单仓库的方式。</p>
<p>不能跨越仓库设置权限。</p>
<h1>启动和停止svn</h1>
<h2>启动<h2>
<h3>从AnKiang目录启动<h3>
<pre class="code" class="bash">svnserve -d -r /home/.svn/AnKiang</pre>
<p>根目录(/)是AnKiang，authz中规则的配置使用section[/]。访问方式为：</p>
<pre class="code" class="bash">svn://192.168.0.87/</pre>
<h3>从.svn目录启动</h3>
<pre class="code" class="bash">svnserve -d -r /home/.svn</pre>
<p>根目录(/)是.svn，authz中对AnKiang的配置使用section[AnKiang:/]。访问方式为：</p>
<pre class="code" class="bash">svn://192.18.0.87/AnKiang</pre>
 
<h3>自启动svn</h3>
<p>如果需要svn自启动，可以把命令加入/etc/rc.local中</p>
<pre class="code" class="bash">sudo vim /etc/rc.local</pre>
 
<h3>检查svn服务器是否已经启动</h3>
<p>svn默认使用3690端口。如果没有启动，下面的命令将没有信息输出。</p>
<pre class="code" class="bash">netstat -an | grep 3690</pre>
<h2>停止</h2>
<pre class="code" class="bash">killall svnserve</pre>
<h1>Windows下的svn 客户端</h1>
<h2>TortoiseSVN</h2>
<h3>下载地址</h3>
<pre class="url">http://tortoisesvn.net/downloads.html</pre>
<h3>访问方式</h3>
<p>新建一个文件夹，然后右击，在弹出的选单中选择：</p>
<p>在弹出的对话框中填入相关信息：</p>
 
<h2>Sliksvn</h2>
<p>这个命令行下的客户端和在Linux下命令行下的访问方法是一样的。</p>
<p>注意：当这个工具和Tortoise一起用的时候，必须版本相一致，否则有时会出问题。</p>
<h3>下载地址</h3>
<pre class="url">http://www.sliksvn.com/en/download</pre>
<h3>访问方式</h3>
 
<h1>参考文献</h1>
<ol id = "references">
<li>武侯. Ubuntu安装和配置SVN. <br/>
http://www.cnblogs.com/wuhou/archive/2008/09/30/1302471.html</li>
<li>SVN配置. <br/>
http://www.blogjava.net/i369/articles/153192.html</li>
</ol>
</div><!-- content -->
</html>
